import unittest
import jieba
import jieba.posseg
import jieba.analyse


class TestJieBaMethods(unittest.TestCase):

    """
    功能: 精确模式分词-把文本精确的切分开，不存在冗余单词
    输出:
    ```
    ['我', '的', '社保卡', '丢', '了', '怎么办']
    ```
    """
    def test_upper(self):
        lexicon = jieba.lcut('我的社保卡丢了怎么办')
        print(lexicon)

    """
    功能: 全模式分词-把文本中所有可能的词语都扫描出来，有冗余
    输出:
    ```
    ['我', '的', '社保', '社保卡', '丢', '了', '怎么', '怎么办']
    ```
    """
    def test_cut_all(self):
        lexicon = jieba.lcut('我的社保卡丢了怎么办', cut_all=True)
        print(lexicon)

    """
    功能: 搜索引擎模式-在精确模式基础上, 对长词再次切分
    输出:
    ```
    ['我', '的', '社保', '社保卡', '丢', '了', '怎么', '怎么办']
    ```
    """
    def test_search(self):
        lexicon = jieba.lcut_for_search('我的社保卡丢了怎么办')
        print(lexicon)

    """
    输出:
    ```
    我 r
    的 uj
    社保卡 n
    丢 v
    了 ul
    怎么办 l
    ```
    说明:
        1. 词性标注;
    """
    def test_posseg(self):
        lexicon = jieba.posseg.cut('我的社保卡丢了去哪里补办')
        for k, v in lexicon:
            print(k, v)

    """
    功能: 分析一句话的权重信息;
    输出:
    ```
    关键词及权重为：
    社保卡 3.901151024866667
    补办 3.6891547693
    哪里 1.9065989033266666
    动词的关键词及权重为：
    补办 11.0674643079    
    ```
    说明:
        1. allowPOS可以以元组的方式限定所分析的词性.
    """
    def test_analyse(self):
        ori = '我的社保卡丢了去哪里补办'
        strs = jieba.analyse.extract_tags(sentence=ori,  # 待提取原文
                                          topK=20,  # 返回几个TF/IDF权重最大的关键词，默认为20
                                          withWeight=True,  # 是否一并返回关键词的权重值，默认为False
                                          allowPOS=())  # 仅包括指定词性的词，默认为空
        print('关键词及权重为：')
        for (k, v) in strs:
            print(k, v)
        strs = jieba.analyse.extract_tags(sentence=ori,  # 待提取原文
                                          topK=20,  # 返回几个TF/IDF权重最大的关键词，默认为20
                                          withWeight=True,  # 是否一并返回关键词的权重值，默认为False
                                          allowPOS=('v'))  # 仅包括指定词性的词，默认为空
        print('动词的关键词及权重为：')
        for (k, v) in strs:
            print(k, v)


if __name__ == '__main__':
    unittest.main()
